package com.hrt.myprestocode;



import com.facebook.presto.common.block.BlockBuilder;
import com.facebook.presto.common.type.DoubleType;
import com.facebook.presto.common.type.StandardTypes;
import com.facebook.presto.spi.function.*;

/**
 * 自定义UDAF函数，统计平均工资
 */
@AggregationFunction("myudaf")
@Description("xx")
public class MyUDAF {
    /**
     * 数据输入 在不同的worker执行，输入一条数据调用一次
     * @param state 自定义的累加器
     * @param value 传进来的数据
     */
    @InputFunction
    public static void input(LongAndDoubleState state, @SqlType(StandardTypes.DOUBLE) double value){
        //在每个worker中执行，来一条数据执行一次
        state.setLong(state.getLong()+1);
        state.setDouble(state.getDouble()+value);
    }

    /**
     * 中间的汇总
     * @param state 一个worker结果
     * @param state2 另一个worker的结果
     */
    @CombineFunction
    public static void combine(LongAndDoubleState state,LongAndDoubleState state2){
        //将每个worker节点处理完成的结果进行聚合
        state.setLong(state.getLong()+state2.getLong());
        state.setDouble(state.getDouble()+state2.getDouble());
    }

    /**
     * 最终结果的计算
     * @param state 总的计算数据值
     * @param out 结果的输出
     */
    @OutputFunction(StandardTypes.DOUBLE)
    public static void output(LongAndDoubleState state, BlockBuilder out){
        //获取总人数
        long count = state.getLong();
        //获取总钱数
        double amount = state.getDouble();
        if(count==0){
            out.appendNull();//返回空
        }else{
            DoubleType.DOUBLE.writeDouble(out,amount/count);
        }

    }

}
